package com.scg33.inicio;

import java.util.Hashtable;
import java.util.List;

import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.Sessions;

import com.coreweb.domain.Domain;
import com.coreweb.util.Misc;
import com.scg33.dominio.Acceso;
import com.scg33.dominio.CalendarioEvento;
import com.scg33.dominio.Capitulo;
import com.scg33.dominio.Novedad;
import com.scg33.dominio.RegisterDomain;
import com.scg33.inicio.calendario.CalendarioDatoModelo;
import com.scg33.util.SistemaPropiedadApp;

public class VMInicio extends VMGenerico {


	AccesoDTO dto = null;
	public SistemaPropiedadApp sisPro = new SistemaPropiedadApp();

	// Pagina principal
	static Hashtable<String, String[]> mapping = new Hashtable<String, String[]>();

	static {
		// ==== principal =================
		String[][] pags = {
				{ "1", "./palabrasSC.zul", "Palabras del S∴C∴G∴ 33" },
				{ "2", "./historia.zul", "Historia" },
				{ "3", "./documentosAntiguos.zul", "Documentos Antiguos" },
				
				{ "4", "./comunicaciones.zul", "Comunicaciones" },
				{ "5", "./calendario.zul", "Calendario" },
				
				{ "6", "./autoridades.zul", "Autoridades y Miembros" },
				{ "7", "./contacto.zul", "Contácto" },
				{ "8", "./acceso.zul", "Acceso" }, 
				// { "9", "./informacionGeneral.zul", "Innformación General" }, 
				};

		cargaPaginas(pags, mapping);

	}

	@Override
	public String getPaginaDefault() {
		return PA_CONTENIDO;
	}

	// el contenido a mostrar en la página
	String contenido = "";
	
	@Init(superclass = true)
	public void initVMInicio() {
		contenido = this.getPaginaParametro(mapping, "id");
	}

	@AfterCompose(superclass = true)
	public void afterComposeVMInicio() {

	}

	public String getContenido() {
		return contenido;
	}

	public void saveDominio(Domain d) throws Exception{
		this.saveDominio(d, this.dto.getNombre());
	}
	
	
	// ======== session ===================

	public Session getSessionZK() {
		return Sessions.getCurrent();
	}

	public Object getAtributoSession(String arg) {
		Session s = this.getSessionZK();
		Object atributo = s.getAttribute(arg);
		return atributo;
	}

	public void setAtributoSession(String key, Object value) {
		Session s = this.getSessionZK();
		s.setAttribute(key, value);
	}

	private static String ACCESO_DTO = "accesoDto";

	public boolean isUsuarioLogeado() {
		Object out = this.getSessionAcceso();
		return (out != null);
	}

	public void setUsuarioLogout() {
		this.setSessionAcceso(null);
	}

	public AccesoDTO getSessionAcceso() {
		this.dto = (AccesoDTO) this.getAtributoSession(ACCESO_DTO);
		return dto;
	}

	public void setSessionAcceso(AccesoDTO dto) {
		this.setAtributoSession(ACCESO_DTO, dto);
		this.setDto(dto);
	}

	// ====================================

	// =========== Login ==========

	/**
	 * Verifica si es un usuario del sistema, y guarda en la sessión los datos del mismo
	 * @param usuario
	 * @param clave
	 * @return
	 * @throws Exception 
	 */
	public boolean login(String usuario, String clave) throws Exception {
		boolean out = false;

		clave = this.m.encriptar(clave);
		RegisterDomain rr = RegisterDomain.getInstance();
		Acceso a = rr.getAcceso(usuario, clave);
		if (a != null) {
			// OJO acá preguntar si tiene más de un capítulo

			Capitulo c = a.getCapitulos().get(0);

			
			// crear el AccesoDTO
			AccesoDTO aDto = getAccesoDTO(a, c);
			this.setSessionAcceso(aDto);
			out = true;
		}else{
			this.setUsuarioLogout();
		}

		return out;
	}

	/** Este método hace de assembler (domain to dto
	 * 
	 * @param a
	 * @param c
	 * @return
	 * @throws Exception 
	 */
	private AccesoDTO getAccesoDTO(Acceso a, Capitulo c) throws Exception {

		AccesoDTO aDto = new AccesoDTO();

		// Acceso
		aDto.setNombre(a.getNombre());

		// capitulo
		aDto.setCapituloNombre(c.getNombre());
		aDto.setCapituloCodigo(c.getCodigo());
		aDto.setCapituloId(c.getId());
		aDto.setCapituloListaCorreo(c.getLista());
		aDto.setCapituloInformacionGeneral(c.getInformacionGeneral());
		aDto.setCapituloDirectorio(c.getDirectorio());
		
		// Administrador
		Acceso adm = c.getAdministrador();
		aDto.setAdministradorNombre(adm.getNombre());
		
		if (adm.getId().longValue() == a.getId().longValue()) {
			aDto.setSiAdministrador(true);
		} else {
			aDto.setSiAdministrador(false);
		}
		
		// novedades
		this.refrescarNovedades(aDto);
		
		// calendario
		this.refrescarCalendarioEvento(aDto);
		
		

		return aDto;
	}

	public void refrescarNovedades(AccesoDTO aDto) throws Exception{

		String query = 
				" select nov.id, nov.fecha, nov.titulo, nov.descripcion, nov.usuarioMod " +
				" from Capitulo as c left join c.novedades as nov " +
				" where c.id = "+aDto.getCapituloId()+" " +
				" order by nov.fecha desc ";
		
		RegisterDomain rr = RegisterDomain.getInstance();
		List<Object[]> listNove = rr.hql(query);
		
		aDto.setNovedades(listNove);

	}
	

	public void refrescarCalendarioEvento(AccesoDTO aDto) throws Exception{
		
		String query = 
				" select ce  " +
				" from CalendarioEvento ce " +
				" where ce.idCapitulo = "+aDto.getCapituloId()+" " +
				" order by ce.beginDate ";
		
		RegisterDomain rr = RegisterDomain.getInstance();
		List<Object> listCelEve= rr.hql(query);

		aDto.setCalendarioModelo(new CalendarioDatoModelo());
		
		for (int i = 0; i < listCelEve.size(); i++) {
			CalendarioEvento ce = (CalendarioEvento) listCelEve.get(i);
			aDto.getCalendarioModelo().add(ce);
		}

	}

	
	
	public AccesoDTO getDto() {
		return dto;
	}

	public void setDto(AccesoDTO dto) {
		this.dto = dto;
	}

	
	
	
	
}
